/*
题目描述
对于一个由0..n的所有数按升序组成的序列，我们要进行一些筛选，每次我们取当前所有数字中从小到大的第奇数位个的数，并将其丢弃。重复这一过程直到最后剩下一个数。请求出最后剩下的数字。
输入描述:
每组数据一行一个数字，为题目中的n(n小于等于1000)。
输出描述:
一行输出最后剩下的数字。
输入例子:
500
输出例子:
255
*/
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
const int maxn = 1e5 + 100;
using namespace std;

int a[maxn], b[maxn], n, num, k;

int main()
{
    while (~scanf("%d", &n))
    {
        for (int i = 0; i <= n; i ++)
            a[i] = i;
        memset(b, 0, sizeof(b));
        while (true)
        {
            k = 0;
            for (int i = 0; i <= n; i ++)
                if (!((i + 1) & 1))
                    b[k ++] = a[i];
            if (k == 1)
            {
                printf("%d\n", b[0]);
                break;
            }
            for (int i = 0; i < k; i ++)
                a[i] = b[i];
            n = k - 1;
        }
    }
    return 0;
}
